package com.diandiji.demo.controller;

import com.diandiji.demo.entity.Note;
import com.diandiji.demo.service.NoteService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/Note")
public class NoteController {

        @Resource // 按名称自动注入NoteService的bean对象
        private NoteService noteService;

        // 查询所有笔记
        @GetMapping("/all")
        public List<Note> queryAllNote(HttpServletRequest request) {
            //HttpServletRequest request是一个 Servlet API 中的对象，它封装了客户端发送的 HTTP 请求信息。
            // 通过这个对象，可以获取请求的各种参数、头信息、请求体等内容

            // 从请求属性中获取 currentUserId，并检查是否为 null
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            // getAttribute方法用于从请求对象中获取指定名称的属性值。
            //getAttribute方法返回的是Object类型，而代码中需要的是int类型的用户 ID，所以使用强制类型转换将其转换为int类型。
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            return noteService.queryAllNote(currentUserId);
        }

        // 根据标签或标题查询笔记
        @GetMapping("/search")
        public List<Note> queryNoteByTagOrTitle(@RequestParam(required = false) String tag,
                                                @RequestParam(required = false) String title,
                                                HttpServletRequest request) {
            //@RequestParam: 用于从请求参数中获取值，required = false表示该参数不是必须的。
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            System.out.println("[Controller日志] 用户ID:" + currentUserId + "，搜索标签/标题：" + tag + "/" + title);
            List<Note> result = noteService.queryNoteByTagOrTitle(tag, title, currentUserId);
            System.out.println("[Controller日志] 返回笔记数量：" + result.size());
            return result;
        }

        // 根据分区编号查询笔记
        @RequestMapping("/area/{areaID}")
        public List<Note> queryNoteByAreaID(HttpServletRequest request, @PathVariable int areaID) {

            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            List<Note> result = noteService.queryNoteByAreaID(areaID, currentUserId);
            return result;
        }


        // 根据笔记ID查询笔记
        @GetMapping("/{noteId}")
        public Note getNoteById(@PathVariable int noteId, HttpServletRequest request) {
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            Note note = noteService.getNoteById(noteId);
            // 添加权限校验：确保查询的笔记属于当前用户
            if (note.getUserID() != currentUserId) {
                throw new IllegalArgumentException("无权访问此笔记");
            }
            return note;
        }

        // 添加笔记
        @PostMapping("/add")
        public Note addNote(@Validated @RequestBody Note note, HttpServletRequest request) {
            //@Validated: 确保传入的 Note 对象经过校验，符合 @NotNull 等约束
            //@RequestBody注解，主要用于处理 HTTP 请求中的 JSON、XML 等格式的数据，并将其绑定到一个 Java 对象上。
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            note.setUserID(currentUserId);
            noteService.addNote(note);
            return note;
        }

        // 修改笔记
        @PutMapping("/update")
        public String updateNote(@Validated @RequestBody Note note) {
            //@Validated: 确保传入的 Note 对象经过校验，符合 @NotNull 等约束
            //@RequestBody注解，主要用于处理 HTTP 请求中的 JSON、XML 等格式的数据，并将其绑定到一个 Java 对象上。

            noteService.updateNote(note);
            return "修改成功!";
        }

        // 删除笔记
        @DeleteMapping("/delete/{noteId}")
        public String deleteNote(@PathVariable int noteId, HttpServletRequest request) {
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }
            Note note = noteService.getNoteById(noteId);
            if (note.getUserID() != currentUserId) {
                throw new IllegalArgumentException("无权删除此笔记");
            }
            noteService.deleteNote(noteId);
            return "删除成功";
        }


        //上传图片
        @PostMapping("/uploadImage")
        @ResponseBody
        public String uploadImage(@RequestParam("file") MultipartFile file,
                                  //MultipartFile 是 Java 中用于处理文件上传的接口，
                                  //当客户端通过表单以 multipart/form-data 格式提交包含文件的请求时，
                                  // Spring 会把上传的文件封装成 MultipartFile 对象.
                                  @RequestParam("noteId") int noteId,
                                  HttpServletRequest request) {
            Integer currentUserId = (Integer) request.getAttribute("currentUserId");
            if (currentUserId == null) {
                throw new IllegalArgumentException("用户未登录或认证失败");
            }

            // 检查文件是否为空
            if (file.isEmpty()) {
                throw new IllegalArgumentException("上传的文件为空");
            }

            // 检查文件类型
            String contentType = file.getContentType();
            List<String> allowedTypes = List.of("image/jpeg", "image/png", "image/gif");
            if (!allowedTypes.contains(contentType)) {
                throw new IllegalArgumentException("不支持的文件类型，请上传 JPEG、PNG 或 GIF 格式的图片");
            }

            try {
                String fileName = currentUserId + "_" + System.currentTimeMillis() + "_" + file.getOriginalFilename();
                String filePath = "D:/upload/" + fileName;
                File targetFile = new File(filePath);
                // 检查保存路径是否存在，如果不存在则创建
                File parentDir = targetFile.getParentFile();
                if (parentDir != null && !parentDir.exists()) {
                    if (!parentDir.mkdirs()) {
                        throw new IOException("无法创建保存路径: " + parentDir.getAbsolutePath());
                    }
                }
                file.transferTo(targetFile);
                String imageUrl = "http://localhost:8848/uploads/" + fileName;

                // 获取笔记并添加图片 URL
                Note note = noteService.getNoteById(noteId);
                if (note != null) {
                    note.addImageUrl(imageUrl);
                    noteService.updateNote(note);
                }

                return imageUrl;
            } catch (IOException e) {
                //IOException 是 Java 标准库中 java.io 包下的一个受检查异常
                //用于表示在输入 / 输出（I/O）操作过程中可能出现的错误
                e.printStackTrace();
                throw new RuntimeException("图片上传失败", e);
            }
        }
}

